/**
 * Copyright (c) [2025] [AGIROS] 
 * [travoddsgen] is licensed under Mulan PSL v2. 
 * You can use this software according to the terms and conditions of the Mulan PSL v2. 
 * You may obtain a copy of Mulan PSL v2 at: 
 *          http://license.coscl.org.cn/MulanPSL2 
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 
 * See the Mulan PSL v2 for more details.
 */ 

#ifndef cpplangtypesupportsourcevisitor_h__
#define cpplangtypesupportsourcevisitor_h__

#include "FileGenVisitor.h"
#include "CppLangTypeNameVisitor.h"
#include "CppLangTypeSupportHeaderVisitor.h"
#include "CppLangSerializeVisitor.h"
#include "CppLangGetSerializeSizeVisitor.h"
#include "CppLangGetMaxSerializeSizeVisitor.h"
#include "CppLangDeserializeVisitor.h"
#include "CppLangSerializeKeyVisitor.h"

class CppLangTypeSupportSourceVisitor : public FileGenVisitor {
public:
    CppLangTypeSupportSourceVisitor(
        const std::string& outputDir, 
        const std::string& fileName, 
        CppLangTypeNameVisitor* typeNameVisitor,
        const std::string& headerFile);
    
public:
    void visit(SpecificationNode& node) override;
    void visit(IncludeDclNode& node) override;
    void visit(StructDefNode& node) override;
    void visit(UnionDefNode& node) override;
private:
    
    /**
     * @brief 生成get_instance单例函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateGetInstanceFuncImpl(ConstrTypeDclNode& node);
    
    /**
     * @brief 生成create_data函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateCreateDataFuncImpl(ConstrTypeDclNode& node);

    /**
     * @brief 生成delete_data函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateDeleteDataFuncImpl(ConstrTypeDclNode& node);

    /**
     * @brief 生成copy_data函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateCopyDataFuncImpl(ConstrTypeDclNode& node);

    /**
     * @brief 生成get_serialized_data_size函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateGetSerializedDataSizeFuncImpl(ConstrTypeDclNode& node);

    /**
     * @brief 生成get_max_serialized_data_size函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateGetMaxSerializedDataSizeFuncImpl(ConstrTypeDclNode& node);

    /**
     * @brief 生成serialize_data函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateSerializeDataFuncImpl(StructDefNode& node);
    
    /**
     * @brief 生成serialize_data函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateSerializeDataFuncImpl(UnionDefNode& node);

    /**
     * @brief 生成deserialize_data函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateDeserializeDataFuncImpl(StructDefNode& node);

    /**
     * @brief 生成deserialize_data函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateDeserializeDataFuncImpl(UnionDefNode& node);
    /**
     * @brief 生成get_typeobject函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateGetTypeObjectFuncImpl(ConstrTypeDclNode& node);

    /**
     * @brief 生成get_instancehandle函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateGetInstanceHandleFuncImpl(ConstrTypeDclNode& node);

    /**
     * @brief 生成get_instancehandle函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateMakeKeyFuncImpl(ConstrTypeDclNode& node);

    /**
     * @brief 生成has_key函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateHasKeyFuncImpl(StructDefNode& node);

    /**
     * @brief 生成has_key函数的实现。
     * 
     * @param node 联合体定义节点。
     */
    void generateHasKeyFuncImpl(UnionDefNode& node);

    /**
     * @brief 生成get_typename函数的实现。
     * 
     * @param node 结构体定义节点。
     */
    void generateGetTypenameFuncImpl(ConstrTypeDclNode& node);

private:
    /** @brief 无上界的类型。 */
    std::map<ASTNode*, unsigned int> unboundedTypes_;
    /** @brief 类型名Visitor。 */
    CppLangTypeNameVisitor* typeNameVisitor_;
    /** @brief 头文件名称。 */
    std::string headerFile_;
    /** GetSerializeSize函数生成。 */
    CppLangGetSerializeSizeVisitor* getSerializeSizeVisitor_;
    /** GetMaxSerializeSize函数生成。 */
    CppLangGetMaxSerializeSizeVisitor* getMaxSerializeSizeVisitor_;
    /** Serialize函数生成。 */
    CppLangSerializeVisitor* serializeVisitor_;
    /** Deserialize函数生成。 */
    CppLangDeserializeVisitor* deserializeVisitor_;
    /** SerializeKey函数生成。 */
    CppLangSerializeKeyVisitor* serializeKeyVisitor_;
};

#endif // cpplangtypesupportsourcevisitor_h__